/************************************************************/
/*  IMM.H - Input Method Manager definitions         */
/*                                                                              */
/*  Copyright (c) 1993-1995  Microsoft Corporation  */
/*************************************************************/
#ifndef _IMM_
#define _IMM_  // defined if IMM.H has been included

#ifdef __cplusplus
extern "C" {
#endif

#ifndef _WINUSER_
#define VK_PROCESSKEY 0x0E5
#endif

#ifndef WINVER
#define WINVER 0x040A
#endif

#if(WINVER >= 0x040A)
DECLARE_HANDLE(HIMC);
#else
typedef DWORD   HIMC;
#endif

#if(WINVER >= 0x040A)
DECLARE_HANDLE(HIMCC);
#else
typedef DWORD   HIMCC;
#endif

typedef HKL FAR  *LPHKL;
typedef UINT FAR *LPUINT;

#define NULLIMC  ((HIMC)0)

typedef struct tagCOMPOSITIONFORM {
  DWORD dwStyle;
  POINT ptCurrentPos;
  RECT  rcArea;
} COMPOSITIONFORM, *PCOMPOSITIONFORM, NEAR *NPCOMPOSITIONFORM, FAR *LPCOMPOSITIONFORM;

typedef struct tagCANDIDATEFORM {
  DWORD dwIndex;
  DWORD dwStyle;
  POINT ptCurrentPos;
  RECT  rcArea;
} CANDIDATEFORM, *PCANDIDATEFORM, NEAR *NPCANDIDATEFORM, FAR *LPCANDIDATEFORM;

typedef struct tagCOMPOSITIONSTRING { 
  DWORD dwSize; 
  DWORD dwCompReadAttrLen; 
  DWORD dwCompReadAttrOffset; 
  DWORD dwCompReadClauseLen; 
  DWORD dwCompReadClauseOffset; 
  DWORD dwCompReadStrLen; 
  DWORD dwCompReadStrOffset; 
  DWORD dwCompAttrLen; 
  DWORD dwCompAttrOffset; 
  DWORD dwCompClauseLen; 
  DWORD dwCompClauseOffset; 
  DWORD dwCompStrLen; 
  DWORD dwCompStrOffset; 
  DWORD dwCursorPos; 
  DWORD dwDeltaStart; 
  DWORD dwResultReadClauseLen; 
  DWORD dwResultReadClauseOffset; 
  DWORD dwResultReadStrLen; 
  DWORD dwResultReadStrOffset; 
  DWORD dwResultClauseLen; 
  DWORD dwResultClauseOffset; 
  DWORD dwResultStrLen; 
  DWORD dwResultStrOffset; 
  DWORD dwPrivateSize; 
  DWORD dwPrivateOffset; 
} COMPOSITIONSTRING, *PCOMPOSITIONSTRING, NEAR *NPCOMPOSITIONSTRING, FAR  *LPCOMPOSITIONSTRING; 
 
 
typedef struct tagGUIDELINE { 
  DWORD dwSize; 
  DWORD dwLevel; 
  DWORD dwIndex; 
  DWORD dwStrLen; 
  DWORD dwStrOffset; 
  DWORD dwPrivateSize; 
  DWORD dwPrivateOffset; 
} GUIDELINE, *PGUIDELINE, NEAR *NPGUIDELINE, FAR *LPGUIDELINE; 
 
 
typedef struct tagCANDIDATELIST {
  DWORD dwSize;
  DWORD dwStyle;
  DWORD dwCount;
  DWORD dwSelection;
  DWORD dwPageStart;
  DWORD dwPageSize;
  DWORD dwOffset[1];
} CANDIDATELIST, *PCANDIDATELIST, NEAR *NPCANDIDATELIST, FAR *LPCANDIDATELIST;

typedef struct tagREGISTERWORDA {
  LPSTR   lpReading;
  LPSTR   lpWord;
} REGISTERWORDA, *PREGISTERWORDA, NEAR *NPREGISTERWORDA, FAR *LPREGISTERWORDA;
typedef struct tagREGISTERWORDW {
  LPWSTR  lpReading;
  LPWSTR  lpWord;
} REGISTERWORDW, *PREGISTERWORDW, NEAR *NPREGISTERWORDW, FAR *LPREGISTERWORDW;
#ifdef UNICODE
typedef REGISTERWORDW REGISTERWORD;
typedef PREGISTERWORDW PREGISTERWORD;
typedef NPREGISTERWORDW NPREGISTERWORD;
typedef LPREGISTERWORDW LPREGISTERWORD;
#else
typedef REGISTERWORDA REGISTERWORD;
typedef PREGISTERWORDA PREGISTERWORD;
typedef NPREGISTERWORDA NPREGISTERWORD;
typedef LPREGISTERWORDA LPREGISTERWORD;
#endif // UNICODE

#if(WINVER >= 0x040A)
typedef struct tagRECONVERTSTRING {
  DWORD dwSize;
  DWORD dwVersion;
  DWORD dwStrLen;
  DWORD dwStrOffset;
  DWORD dwCompStrLen;
  DWORD dwCompStrOffset;
  DWORD dwTargetStrLen;
  DWORD dwTargetStrOffset;
} RECONVERTSTRING, *PRECONVERTSTRING, NEAR *NPRECONVERTSTRING, FAR *LPRECONVERTSTRING;
#endif

typedef struct tagCANDIDATEINFO { 
  DWORD   dwSize; 
  DWORD   dwCount; 
  DWORD   dwOffset[32]; 
  DWORD   dwPrivateSize; 
  DWORD   dwPrivateOffset; 
} CANDIDATEINFO, *PCANDIDATEINFO, NEAR *NPCANDIDATEINFO, FAR *LPCANDIDATEINFO; 
 
 
typedef struct tagINPUTCONTEXT { 
  HWND   hWnd; 
  BOOL   fOpen; 
  POINT   ptStatusWndPos; 
  POINT   ptSoftKbdPos; 
  DWORD   fdwConversion; 
  DWORD   fdwSentence; 
  union  { 
  LOGFONTA   A; 
  LOGFONTW   W; 
 } lfFont; 
  COMPOSITIONFORM   cfCompForm; 
  CANDIDATEFORM   cfCandForm[4]; 
  HIMCC   hCompStr; 
  HIMCC   hCandInfo; 
  HIMCC   hGuideLine; 
  HIMCC   hPrivate; 
  DWORD   dwNumMsgBuf; 
  HIMCC   hMsgBuf; 
  DWORD   fdwInit; 
  DWORD   dwReserve[3]; 
} INPUTCONTEXT, *PINPUTCONTEXT, NEAR *NPINPUTCONTEXT, FAR *LPINPUTCONTEXT; 
 
 
typedef struct tagIMEINFO { 
  DWORD   dwPrivateDataSize; 
  DWORD   fdwProperty; 
  DWORD   fdwConversionCaps; 
  DWORD   fdwSentenceCaps; 
  DWORD   fdwUICaps; 
  DWORD   fdwSCSCaps; 
  DWORD   fdwSelectCaps; 
} IMEINFO, *PIMEINFO, NEAR *NPIMEINFO, FAR *LPIMEINFO; 
 
 
#define STYLE_DESCRIPTION_SIZE  32

typedef struct tagSTYLEBUFA {
  DWORD   dwStyle;
  CHAR   szDescription[STYLE_DESCRIPTION_SIZE];
} STYLEBUFA, *PSTYLEBUFA, NEAR *NPSTYLEBUFA, FAR *LPSTYLEBUFA;
typedef struct tagSTYLEBUFW {
  DWORD   dwStyle;
  WCHAR   szDescription[STYLE_DESCRIPTION_SIZE];
} STYLEBUFW, *PSTYLEBUFW, NEAR *NPSTYLEBUFW, FAR *LPSTYLEBUFW;
#ifdef UNICODE
typedef STYLEBUFW STYLEBUF;
typedef PSTYLEBUFW PSTYLEBUF;
typedef NPSTYLEBUFW NPSTYLEBUF;
typedef LPSTYLEBUFW LPSTYLEBUF;
#else
typedef STYLEBUFA STYLEBUF;
typedef PSTYLEBUFA PSTYLEBUF;
typedef NPSTYLEBUFA NPSTYLEBUF;
typedef LPSTYLEBUFA LPSTYLEBUF;
#endif // UNICODE

#if(WINVER >= 0x040A)
#define IMEMENUITEM_STRING_SIZE 80 

typedef struct tagIMEMENUITEMINFOA {
  UINT   cbSize;
  UINT   fType;
  UINT   fState;
  UINT   wID;
  HBITMAP   hbmpChecked;
  HBITMAP   hbmpUnchecked;
  DWORD   dwItemData;
  CHAR   szString[IMEMENUITEM_STRING_SIZE];
  HBITMAP   hbmpItem;
} IMEMENUITEMINFOA, *PIMEMENUITEMINFOA, NEAR *NPIMEMENUITEMINFOA, FAR *LPIMEMENUITEMINFOA;
typedef struct tagIMEMENUITEMINFOW {
  UINT   cbSize;
  UINT   fType;
  UINT   fState;
  UINT   wID;
  HBITMAP   hbmpChecked;
  HBITMAP   hbmpUnchecked;
  DWORD   dwItemData;
  WCHAR   szString[IMEMENUITEM_STRING_SIZE];
  HBITMAP   hbmpItem;
} IMEMENUITEMINFOW, *PIMEMENUITEMINFOW, NEAR *NPIMEMENUITEMINFOW, FAR *LPIMEMENUITEMINFOW;
#ifdef UNICODE
typedef IMEMENUITEMINFOW IMEMENUITEMINFO;
typedef PIMEMENUITEMINFOW PIMEMENUITEMINFO;
typedef NPIMEMENUITEMINFOW NPIMEMENUITEMINFO;
typedef LPIMEMENUITEMINFOW LPIMEMENUITEMINFO;
#else
typedef IMEMENUITEMINFOA IMEMENUITEMINFO;
typedef PIMEMENUITEMINFOA PIMEMENUITEMINFO;
typedef NPIMEMENUITEMINFOA NPIMEMENUITEMINFO;
typedef LPIMEMENUITEMINFOA LPIMEMENUITEMINFO;
#endif // UNICODE

typedef struct tagIMECHARPOSITION {
  DWORD   dwSize;
  DWORD   dwCharPos;
  POINT   pt;
  UINT   cLineHeight;
  RECT   rcDocument;
} IMECHARPOSITION, *PIMECHARPOSITION, NEAR *NPIMECHARPOSITION, FAR *LPIMECHARPOSITION;

#endif /* WINVER >= 0x040A */

typedef struct tagSOFTKBDDATA { 
  UINT   uCount; 
  WORD   wCode[1][256]; 
} SOFTKBDDATA, *PSOFTKBDDATA, NEAR *NPSOFTKBDDATA, FAR * LPSOFTKBDDATA; 
 
 
typedef struct _tagTRANSMSG{
	UINT  message;
	WPARAM  wParam;
	LPARAM  lParam;
}TRANSMSG, *LPTRANSMSG;

// prototype of IMM API

HKL  WINAPI ImmInstallIMEA(LPCSTR lpszIMEFileName, LPCSTR lpszLayoutText);
HKL  WINAPI ImmInstallIMEW(LPCWSTR lpszIMEFileName, LPCWSTR lpszLayoutText);
#ifdef UNICODE
#define ImmInstallIME  ImmInstallIMEW
#else
#define ImmInstallIME  ImmInstallIMEA
#endif // !UNICODE

HWND WINAPI ImmGetDefaultIMEWnd(HWND);

UINT WINAPI ImmGetDescriptionA(HKL, LPSTR, UINT uBufLen);
UINT WINAPI ImmGetDescriptionW(HKL, LPWSTR, UINT uBufLen);
#ifdef UNICODE
#define ImmGetDescription  ImmGetDescriptionW
#else
#define ImmGetDescription  ImmGetDescriptionA
#endif // !UNICODE

UINT WINAPI ImmGetIMEFileNameA(HKL, LPSTR, UINT uBufLen);
UINT WINAPI ImmGetIMEFileNameW(HKL, LPWSTR, UINT uBufLen);
#ifdef UNICODE
#define ImmGetIMEFileName  ImmGetIMEFileNameW
#else
#define ImmGetIMEFileName  ImmGetIMEFileNameA
#endif // !UNICODE

DWORD WINAPI ImmGetProperty(HKL, DWORD);

BOOL WINAPI ImmIsIME(HKL);

BOOL WINAPI ImmGetHotKey(DWORD, LPUINT, LPUINT, LPHKL); 
BOOL WINAPI ImmSetHotKey(DWORD, UINT, UINT, HKL); 
BOOL WINAPI ImmSimulateHotKey(HWND, DWORD);

HIMC WINAPI ImmCreateContext(void);
BOOL WINAPI ImmDestroyContext(HIMC);
HIMC WINAPI ImmGetContext(HWND);
BOOL WINAPI ImmReleaseContext(HWND, HIMC);
HIMC WINAPI ImmAssociateContext(HWND, HIMC);
#if(WINVER >= 0x040A)
BOOL WINAPI ImmAssociateContextEx(HWND, HIMC, DWORD);
#endif /* WINVER >= 0x040A */

LONG  WINAPI ImmGetCompositionStringA(HIMC, DWORD, LPVOID, DWORD);
LONG  WINAPI ImmGetCompositionStringW(HIMC, DWORD, LPVOID, DWORD);
#ifdef UNICODE
#define ImmGetCompositionString  ImmGetCompositionStringW
#else
#define ImmGetCompositionString  ImmGetCompositionStringA
#endif // !UNICODE

BOOL  WINAPI ImmSetCompositionStringA(HIMC, DWORD, LPCVOID, DWORD, LPCVOID, DWORD);
BOOL  WINAPI ImmSetCompositionStringW(HIMC, DWORD, LPCVOID, DWORD, LPCVOID, DWORD);
#ifdef UNICODE
#define ImmSetCompositionString  ImmSetCompositionStringW
#else
#define ImmSetCompositionString  ImmSetCompositionStringA
#endif // !UNICODE

DWORD WINAPI ImmGetCandidateListCountA(HIMC, LPDWORD);
DWORD WINAPI ImmGetCandidateListCountW(HIMC, LPDWORD);
#ifdef UNICODE
#define ImmGetCandidateListCount  ImmGetCandidateListCountW
#else
#define ImmGetCandidateListCount  ImmGetCandidateListCountA
#endif // !UNICODE

DWORD WINAPI ImmGetCandidateListA(HIMC, DWORD, LPCANDIDATELIST, DWORD);
DWORD WINAPI ImmGetCandidateListW(HIMC, DWORD, LPCANDIDATELIST, DWORD);
#ifdef UNICODE
#define ImmGetCandidateList  ImmGetCandidateListW
#else
#define ImmGetCandidateList  ImmGetCandidateListA
#endif // !UNICODE

DWORD WINAPI ImmGetGuideLineA(HIMC, DWORD, LPSTR, DWORD);
DWORD WINAPI ImmGetGuideLineW(HIMC, DWORD, LPWSTR, DWORD);
#ifdef UNICODE
#define ImmGetGuideLine  ImmGetGuideLineW
#else
#define ImmGetGuideLine  ImmGetGuideLineA
#endif // !UNICODE

BOOL WINAPI ImmGetConversionStatus(HIMC, LPDWORD, LPDWORD);
BOOL WINAPI ImmSetConversionStatus(HIMC, DWORD, DWORD);
BOOL WINAPI ImmGetOpenStatus(HIMC);
BOOL WINAPI ImmSetOpenStatus(HIMC, BOOL);

BOOL WINAPI ImmGetCompositionFontA(HIMC, LPLOGFONTA);
BOOL WINAPI ImmGetCompositionFontW(HIMC, LPLOGFONTW);
#ifdef UNICODE
#define ImmGetCompositionFont  ImmGetCompositionFontW
#else
#define ImmGetCompositionFont  ImmGetCompositionFontA
#endif // !UNICODE

BOOL WINAPI ImmSetCompositionFontA(HIMC, LPLOGFONTA);
BOOL WINAPI ImmSetCompositionFontW(HIMC, LPLOGFONTW);
#ifdef UNICODE
#define ImmSetCompositionFont  ImmSetCompositionFontW
#else
#define ImmSetCompositionFont  ImmSetCompositionFontA
#endif // !UNICODE

BOOL   WINAPI ImmConfigureIMEA(HKL, HWND, DWORD, LPVOID);
BOOL   WINAPI ImmConfigureIMEW(HKL, HWND, DWORD, LPVOID);
#ifdef UNICODE
#define ImmConfigureIME  ImmConfigureIMEW
#else
#define ImmConfigureIME  ImmConfigureIMEA
#endif // !UNICODE

LRESULT WINAPI ImmEscapeA(HKL, HIMC, UINT, LPVOID);
LRESULT WINAPI ImmEscapeW(HKL, HIMC, UINT, LPVOID);
#ifdef UNICODE
#define ImmEscape  ImmEscapeW
#else
#define ImmEscape  ImmEscapeA
#endif // !UNICODE

DWORD   WINAPI ImmGetConversionListA(HKL, HIMC, LPCSTR, LPCANDIDATELIST, DWORD, UINT);
DWORD   WINAPI ImmGetConversionListW(HKL, HIMC, LPCWSTR, LPCANDIDATELIST, DWORD, UINT);
#ifdef UNICODE
#define ImmGetConversionList  ImmGetConversionListW
#else
#define ImmGetConversionList  ImmGetConversionListA
#endif // !UNICODE

BOOL   WINAPI ImmNotifyIME(HIMC, DWORD, DWORD, DWORD);

BOOL WINAPI ImmGetStatusWindowPos(HIMC, LPPOINT);
BOOL WINAPI ImmSetStatusWindowPos(HIMC, LPPOINT);
BOOL WINAPI ImmGetCompositionWindow(HIMC, LPCOMPOSITIONFORM);
BOOL WINAPI ImmSetCompositionWindow(HIMC, LPCOMPOSITIONFORM);
BOOL WINAPI ImmGetCandidateWindow(HIMC, DWORD, LPCANDIDATEFORM);
BOOL WINAPI ImmSetCandidateWindow(HIMC, LPCANDIDATEFORM);

BOOL WINAPI ImmIsUIMessageA(HWND, UINT, WPARAM, LPARAM);
BOOL WINAPI ImmIsUIMessageW(HWND, UINT, WPARAM, LPARAM);
#ifdef UNICODE
#define ImmIsUIMessage  ImmIsUIMessageW
#else
#define ImmIsUIMessage  ImmIsUIMessageA
#endif // !UNICODE

BOOL WINAPI ImmGenerateMessage(HIMC); 
UINT WINAPI ImmGetVirtualKey(HWND);

typedef int (CALLBACK *REGISTERWORDENUMPROCA)(LPCSTR, DWORD, LPCSTR, LPVOID);
typedef int (CALLBACK *REGISTERWORDENUMPROCW)(LPCWSTR, DWORD, LPCWSTR, LPVOID);
#ifdef UNICODE
#define REGISTERWORDENUMPROC  REGISTERWORDENUMPROCW
#else
#define REGISTERWORDENUMPROC  REGISTERWORDENUMPROCA
#endif // !UNICODE

BOOL WINAPI ImmRegisterWordA(HKL, LPCSTR, DWORD, LPCSTR);
BOOL WINAPI ImmRegisterWordW(HKL, LPCWSTR, DWORD, LPCWSTR);
#ifdef UNICODE
#define ImmRegisterWord  ImmRegisterWordW
#else
#define ImmRegisterWord  ImmRegisterWordA
#endif // !UNICODE

BOOL WINAPI ImmUnregisterWordA(HKL, LPCSTR, DWORD, LPCSTR);
BOOL WINAPI ImmUnregisterWordW(HKL, LPCWSTR, DWORD, LPCWSTR);
#ifdef UNICODE
#define ImmUnregisterWord  ImmUnregisterWordW
#else
#define ImmUnregisterWord  ImmUnregisterWordA
#endif // !UNICODE

UINT WINAPI ImmGetRegisterWordStyleA(HKL, UINT, LPSTYLEBUFA);
UINT WINAPI ImmGetRegisterWordStyleW(HKL, UINT, LPSTYLEBUFW);
#ifdef UNICODE
#define ImmGetRegisterWordStyle  ImmGetRegisterWordStyleW
#else
#define ImmGetRegisterWordStyle  ImmGetRegisterWordStyleA
#endif // !UNICODE

UINT WINAPI ImmEnumRegisterWordA(HKL, REGISTERWORDENUMPROCA, LPCSTR, DWORD, LPCSTR, LPVOID);
UINT WINAPI ImmEnumRegisterWordW(HKL, REGISTERWORDENUMPROCW, LPCWSTR, DWORD, LPCWSTR, LPVOID);
#ifdef UNICODE
#define ImmEnumRegisterWord  ImmEnumRegisterWordW
#else
#define ImmEnumRegisterWord  ImmEnumRegisterWordA
#endif // !UNICODE

#if(WINVER >= 0x040A)
BOOL WINAPI ImmDisableIME(DWORD);
DWORD WINAPI ImmGetImeMenuItemsA(HIMC, DWORD, DWORD, LPIMEMENUITEMINFOA, LPIMEMENUITEMINFOA, DWORD);
DWORD WINAPI ImmGetImeMenuItemsW(HIMC, DWORD, DWORD, LPIMEMENUITEMINFOW, LPIMEMENUITEMINFOW, DWORD);
#ifdef UNICODE
#define ImmGetImeMenuItems  ImmGetImeMenuItemsW
#else
#define ImmGetImeMenuItems  ImmGetImeMenuItemsA
#endif // !UNICODE
LRESULT WINAPI ImmRequestMessageA(HIMC, WPARAM, LPARAM); 
LRESULT WINAPI ImmRequestMessageW(HIMC, WPARAM, LPARAM); 
#ifdef UNICODE
#define ImmRequestMessage  ImmRequestMessageW
#else
#define ImmRequestMessage  ImmRequestMessageA
#endif // !UNICODE
#endif /* WINVER >= 0x040A */

// 
// Prototype of soft keyboard APIs  
// 
 
HWND WINAPI ImmCreateSoftKeyboard(UINT, HWND, int, int); 
BOOL WINAPI ImmDestroySoftKeyboard(HWND); 
BOOL WINAPI ImmShowSoftKeyboard(HWND, int); 
 
 
LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC); 
BOOL  WINAPI ImmUnlockIMC(HIMC); 
DWORD WINAPI ImmGetIMCLockCount(HIMC); 
 
 
HIMCC  WINAPI ImmCreateIMCC(DWORD); 
HIMCC  WINAPI ImmDestroyIMCC(HIMCC); 
LPVOID WINAPI ImmLockIMCC(HIMCC); 
BOOL   WINAPI ImmUnlockIMCC(HIMCC); 
DWORD  WINAPI ImmGetIMCCLockCount(HIMCC); 
HIMCC  WINAPI ImmReSizeIMCC(HIMCC, DWORD); 
DWORD  WINAPI ImmGetIMCCSize(HIMCC); 
 
 
// the window extra offset  
#define IMMGWL_IMC   0  
#define IMMGWL_PRIVATE  sizeof(LONG_PTR)
#define FIGWL_SVRWND 0

 
 

// the IME related messages
#define WM_CONVERTREQUESTEX   0x0108
#define WM_IME_STARTCOMPOSITION   0x010D
#define WM_IME_ENDCOMPOSITION   0x010E
#define WM_IME_COMPOSITION   0x010F
#define WM_IME_KEYLAST   0x010F

#define WM_IME_SETCONTEXT   0x0281
#define WM_IME_NOTIFY   0x0282
#define WM_IME_CONTROL   0x0283
#define WM_IME_COMPOSITIONFULL   0x0284
#define WM_IME_SELECT   0x0285
#define WM_IME_CHAR   0x0286
#define WM_IME_REQUEST   0x0288

#define WM_IME_KEYDOWN   0x0290
#define WM_IME_KEYUP   0x0291

// wParam for WM_IME_CONTROL  
#define IMC_GETCANDIDATEPOS   0x0007
#define IMC_SETCANDIDATEPOS   0x0008
#define IMC_GETCOMPOSITIONFONT   0x0009
#define IMC_SETCOMPOSITIONFONT   0x000A
#define IMC_GETCOMPOSITIONWINDOW   0x000B
#define IMC_SETCOMPOSITIONWINDOW   0x000C
#define IMC_GETSTATUSWINDOWPOS   0x000F
#define IMC_SETSTATUSWINDOWPOS   0x0010
#define IMC_CLOSESTATUSWINDOW   0x0021
#define IMC_OPENSTATUSWINDOW   0x0022

// for NI_CONTEXTUPDATED  
#define IMC_SETCONVERSIONMODE   0x0002  
#define IMC_SETSENTENCEMODE   0x0004  
#define IMC_SETOPENSTATUS   0x0006  

// wParam for WM_IME_CONTROL to the soft keyboard
#define IMC_GETSOFTKBDFONT   0x0011  
#define IMC_SETSOFTKBDFONT   0x0012  
#define IMC_GETSOFTKBDPOS   0x0013  
#define IMC_SETSOFTKBDPOS   0x0014  
#define IMC_GETSOFTKBDSUBTYPE   0x0015  
#define IMC_SETSOFTKBDSUBTYPE   0x0016  
#define IMC_SETSOFTKBDDATA   0x0018  
 
 
// dwAction for ImmNotifyIME
#define NI_CONTEXTUPDATED   0x0003  
#define NI_OPENCANDIDATE   0x0010
#define NI_CLOSECANDIDATE   0x0011
#define NI_SELECTCANDIDATESTR   0x0012
#define NI_CHANGECANDIDATELIST   0x0013
#define NI_FINALIZECONVERSIONRESULT   0x0014
#define NI_COMPOSITIONSTR   0x0015
#define NI_SETCANDIDATE_PAGESTART   0x0016
#define NI_SETCANDIDATE_PAGESIZE   0x0017
#define NI_IMEMENUSELECTED   0x0018

// lParam for WM_IME_SETCONTEXT
#define ISC_SHOWUICANDIDATEWINDOW   0x00000001
#define ISC_SHOWUICOMPOSITIONWINDOW   0x80000000
#define ISC_SHOWUIGUIDELINE   0x40000000
#define ISC_SHOWUIALLCANDIDATEWINDOW   0x0000000F
#define ISC_SHOWUIALL   0xC000000F

// dwIndex for ImmNotifyIME/NI_COMPOSITIONSTR
#define CPS_COMPLETE   0x0001
#define CPS_CONVERT   0x0002
#define CPS_REVERT   0x0003
#define CPS_CANCEL   0x0004

// the modifiers of hot key
#define MOD_ALT   0x0001
#define MOD_CONTROL   0x0002
#define MOD_SHIFT   0x0004

#define MOD_LEFT   0x8000
#define MOD_RIGHT   0x4000

#define MOD_ON_KEYUP   0x0800
#define MOD_IGNORE_ALL_MODIFIER   0x0400

// Windows for Simplified Chinese Edition hot key ID from 0x10 - 0x2F
#define IME_CHOTKEY_IME_NONIME_TOGGLE   0x10
#define IME_CHOTKEY_SHAPE_TOGGLE   0x11
#define IME_CHOTKEY_SYMBOL_TOGGLE   0x12

// Windows for Japanese Edition hot key ID from 0x30 - 0x4F
#define IME_JHOTKEY_CLOSE_OPEN   0x30

// Windows for Korean Edition hot key ID from 0x50 - 0x6F
#define IME_KHOTKEY_SHAPE_TOGGLE   0x50
#define IME_KHOTKEY_HANJACONVERT   0x51
#define IME_KHOTKEY_ENGLISH   0x52

// Windows for Tranditional Chinese Edition hot key ID from 0x70 - 0x8F
#define IME_THOTKEY_IME_NONIME_TOGGLE   0x70
#define IME_THOTKEY_SHAPE_TOGGLE   0x71
#define IME_THOTKEY_SYMBOL_TOGGLE   0x72

// direct switch hot key ID from 0x100 - 0x11F
#define IME_HOTKEY_DSWITCH_FIRST   0x100
#define IME_HOTKEY_DSWITCH_LAST   0x11F

// IME private hot key from 0x200 - 0x21F
#define IME_HOTKEY_PRIVATE_FIRST   0x200
#define IME_ITHOTKEY_RESEND_RESULTSTR   0x200
#define IME_ITHOTKEY_PREVIOUS_COMPOSITION   0x201
#define IME_ITHOTKEY_UISTYLE_TOGGLE   0x202
#define IME_ITHOTKEY_RECONVERTSTRING   0x203
#define IME_HOTKEY_PRIVATE_LAST   0x21F

// dwSystemInfoFlags bits
#define IME_SYSINFO_WINLOGON   0x0001  
#define IME_SYSINFO_WOW16   0x0002  

// parameter of ImmGetCompositionString
#define GCS_COMPREADSTR   0x0001
#define GCS_COMPREADATTR   0x0002
#define GCS_COMPREADCLAUSE   0x0004
#define GCS_COMPSTR   0x0008
#define GCS_COMPATTR   0x0010
#define GCS_COMPCLAUSE   0x0020
#define GCS_CURSORPOS   0x0080
#define GCS_DELTASTART   0x0100
#define GCS_RESULTREADSTR   0x0200
#define GCS_RESULTREADCLAUSE   0x0400
#define GCS_RESULTSTR   0x0800
#define GCS_RESULTCLAUSE   0x1000

// style bit flags for WM_IME_COMPOSITION
#define CS_INSERTCHAR   0x2000
#define CS_NOMOVECARET   0x4000

#define GCS_COMP  (GCS_COMPSTR|GCS_COMPATTR|GCS_COMPCLAUSE) 
#define GCS_COMPREAD  (GCS_COMPREADSTR|GCS_COMPREADATTR |GCS_COMPREADCLAUSE) 
#define GCS_RESULT  (GCS_RESULTSTR|GCS_RESULTCLAUSE) 
#define GCS_RESULTREAD  (GCS_RESULTREADSTR|GCS_RESULTREADCLAUSE) 

// bits of fdwInit of INPUTCONTEXT
#define INIT_STATUSWNDPOS   0x00000001  
#define INIT_CONVERSION   0x00000002  
#define INIT_SENTENCE   0x00000004  
#define INIT_LOGFONT   0x00000008  
#define INIT_COMPFORM   0x00000010  
#define INIT_SOFTKBDPOS   0x00000020  
 
 
// IME version constants
#define IMEVER_0310   0x0003000A
#define IMEVER_0400   0x00040000

// IME property bits
#define IME_PROP_END_UNLOAD   0x0001  
#define IME_PROP_KBD_CHAR_FIRST   0x0002  
#define IME_PROP_IGNORE_UPKEYS   0x0004  
#define IME_PROP_NEED_ALTKEY   0x0008  
#define IME_PROP_NO_KEYS_ON_CLOSE	0x0010		
#define IME_PROP_AT_CARET   0x00010000
#define IME_PROP_SPECIAL_UI   0x00020000
#define IME_PROP_CANDLIST_START_FROM_1  0x00040000
#define IME_PROP_UNICODE   0x00080000
#define IME_PROP_COMPLETE_ON_UNSELECT   0x00100000

// IME UICapability bits
#define UI_CAP_2700   0x00000001
#define UI_CAP_ROT90   0x00000002
#define UI_CAP_ROTANY   0x00000004
#define UI_CAP_SOFTKBD   0x00010000  

// ImmSetCompositionString Capability bits
#define SCS_CAP_COMPSTR   0x00000001
#define SCS_CAP_MAKEREAD   0x00000002
#define SCS_CAP_SETRECONVERTSTRING   0x00000004

// IME WM_IME_SELECT inheritance Capability bits
#define SELECT_CAP_CONVERSION   0x00000001
#define SELECT_CAP_SENTENCE   0x00000002

// ID for deIndex of ImmGetGuideLine
#define GGL_LEVEL   0x00000001
#define GGL_INDEX   0x00000002
#define GGL_STRING   0x00000003
#define GGL_PRIVATE   0x00000004

// ID for dwLevel of GUIDELINE Structure
#define GL_LEVEL_NOGUIDELINE   0x00000000
#define GL_LEVEL_FATAL   0x00000001
#define GL_LEVEL_ERROR   0x00000002
#define GL_LEVEL_WARNING   0x00000003
#define GL_LEVEL_INFORMATION   0x00000004

// ID for dwIndex of GUIDELINE Structure
#define GL_ID_UNKNOWN   0x00000000
#define GL_ID_NOMODULE   0x00000001
#define GL_ID_NODICTIONARY   0x00000010
#define GL_ID_CANNOTSAVE   0x00000011
#define GL_ID_NOCONVERT   0x00000020
#define GL_ID_TYPINGERROR   0x00000021
#define GL_ID_TOOMANYSTROKE   0x00000022
#define GL_ID_READINGCONFLICT   0x00000023
#define GL_ID_INPUTREADING   0x00000024
#define GL_ID_INPUTRADICAL   0x00000025
#define GL_ID_INPUTCODE   0x00000026
#define GL_ID_INPUTSYMBOL   0x00000027
#define GL_ID_CHOOSECANDIDATE   0x00000028
#define GL_ID_REVERSECONVERSION   0x00000029
#define GL_ID_PRIVATE_FIRST   0x00008000
#define GL_ID_PRIVATE_LAST   0x0000FFFF

// ID for dwIndex of ImmGetProperty
#define IGP_GETIMEVERSION  (DWORD)(-4)
#define IGP_PROPERTY   0x00000004
#define IGP_CONVERSION   0x00000008
#define IGP_SENTENCE   0x0000000c
#define IGP_UI   0x00000010
#define IGP_SETCOMPSTR   0x00000014
#define IGP_SELECT   0x00000018

// dwIndex for ImmSetCompositionString API
#define SCS_SETSTR  (GCS_COMPREADSTR|GCS_COMPSTR)
#define SCS_CHANGEATTR  (GCS_COMPREADATTR|GCS_COMPATTR)
#define SCS_CHANGECLAUSE  (GCS_COMPREADCLAUSE|GCS_COMPCLAUSE)
#define SCS_SETRECONVERTSTRING   0x00010000
#define SCS_QUERYRECONVERTSTRING   0x00020000

// attribute for COMPOSITIONSTRING Structure
#define ATTR_INPUT   0x00
#define ATTR_TARGET_CONVERTED   0x01
#define ATTR_CONVERTED   0x02
#define ATTR_TARGET_NOTCONVERTED   0x03
#define ATTR_INPUT_ERROR   0x04
#define ATTR_FIXEDCONVERTED   0x05

// bit field for IMC_SETCOMPOSITIONWINDOW, IMC_SETCANDIDATEWINDOW
#define CFS_DEFAULT   0x0000
#define CFS_RECT   0x0001
#define CFS_POINT   0x0002
#define CFS_FORCE_POSITION   0x0020
#define CFS_CANDIDATEPOS   0x0040
#define CFS_EXCLUDE   0x0080

// conversion direction for ImmGetConversionList
#define GCL_CONVERSION   0x0001
#define GCL_REVERSECONVERSION   0x0002
#define GCL_REVERSE_LENGTH   0x0003

// bit field for conversion mode
#define IME_CMODE_ALPHANUMERIC   0x0000
#define IME_CMODE_NATIVE   0x0001
#define IME_CMODE_CHINESE   IME_CMODE_NATIVE
#define IME_CMODE_HANGEUL   IME_CMODE_NATIVE
#define IME_CMODE_JAPANESE   IME_CMODE_NATIVE
#define IME_CMODE_KATAKANA   0x0002  // only effect under IME_CMODE_NATIVE
#define IME_CMODE_LANGUAGE   0x0003
#define IME_CMODE_FULLSHAPE   0x0008
#define IME_CMODE_ROMAN   0x0010
#define IME_CMODE_CHARCODE   0x0020
#define IME_CMODE_HANJACONVERT   0x0040
#define IME_CMODE_SOFTKBD   0x0080
#define IME_CMODE_NOCONVERSION   0x0100
#define IME_CMODE_EUDC   0x0200
#define IME_CMODE_SYMBOL   0x0400
#define IME_CMODE_FIXED   0x0800

#define IME_SMODE_NONE   0x0000
#define IME_SMODE_PLAURALCLAUSE   0x0001
#define IME_SMODE_SINGLECONVERT   0x0002
#define IME_SMODE_AUTOMATIC   0x0004
#define IME_SMODE_PHRASEPREDICT   0x0008
#define IME_SMODE_CONVERSATION   0x0010

// style of candidate
#define IME_CAND_UNKNOWN   0x0000
#define IME_CAND_READ   0x0001
#define IME_CAND_CODE   0x0002
#define IME_CAND_MEANING   0x0003
#define IME_CAND_RADICAL   0x0004
#define IME_CAND_STROKE   0x0005

// wParam of report message WM_IME_NOTIFY
#define IMN_CLOSESTATUSWINDOW   0x0001
#define IMN_OPENSTATUSWINDOW   0x0002
#define IMN_CHANGECANDIDATE   0x0003
#define IMN_CLOSECANDIDATE   0x0004
#define IMN_OPENCANDIDATE   0x0005
#define IMN_SETCONVERSIONMODE   0x0006
#define IMN_SETSENTENCEMODE   0x0007
#define IMN_SETOPENSTATUS   0x0008
#define IMN_SETCANDIDATEPOS   0x0009
#define IMN_SETCOMPOSITIONFONT   0x000A
#define IMN_SETCOMPOSITIONWINDOW   0x000B
#define IMN_SETSTATUSWINDOWPOS   0x000C
#define IMN_GUIDELINE   0x000D
#define IMN_PRIVATE   0x000E

#if(WINVER >= 0x040A)
// wParam of report message WM_IME_REQUEST
#define IMR_COMPOSITIONWINDOW   0x0001
#define IMR_CANDIDATEWINDOW   0x0002
#define IMR_COMPOSITIONFONT   0x0003
#define IMR_RECONVERTSTRING   0x0004
#define IMR_CONFIRMRECONVERTSTRING 0x0005
#define IMR_QUERYCHARPOSITION   0x0006
#define IMR_DOCUMENTFEED   0x0007
#endif

#define IMN_SOFTKBDDESTROYED   0x0011  
 
 
// error code of ImmGetCompositionString
#define IMM_ERROR_NODATA  (-1)
#define IMM_ERROR_GENERAL  (-2)

// dialog mode of ImmConfigureIME
#define IME_CONFIG_GENERAL   1
#define IME_CONFIG_REGISTERWORD   2
#define IME_CONFIG_SELECTDICTIONARY   3

// dialog mode of ImmEscape
#define IME_ESC_QUERY_SUPPORT   0x0003
#define IME_ESC_RESERVED_FIRST   0x0004
#define IME_ESC_RESERVED_LAST   0x07FF
#define IME_ESC_PRIVATE_FIRST   0x0800
#define IME_ESC_PRIVATE_LAST   0x0FFF
#define IME_ESC_SEQUENCE_TO_INTERNAL   0x1001
#define IME_ESC_GET_EUDC_DICTIONARY   0x1003
#define IME_ESC_SET_EUDC_DICTIONARY   0x1004
#define IME_ESC_MAX_KEY   0x1005
#define IME_ESC_IME_NAME   0x1006
#define IME_ESC_SYNC_HOTKEY   0x1007
#define IME_ESC_HANJA_MODE   0x1008
#define IME_ESC_AUTOMATA   0x1009
#define IME_ESC_PRIVATE_HOTKEY   0x100a
#define IME_ESC_GETHELPFILENAME   0x100b

// style of word registration
#define IME_REGWORD_STYLE_EUDC   0x00000001
#define IME_REGWORD_STYLE_USER_FIRST   0x80000000
#define IME_REGWORD_STYLE_USER_LAST   0xFFFFFFFF

#if(WINVER >= 0x040A)
// dwFlags for ImmAssociateContextEx
#define IACE_CHILDREN   0x0001
#define IACE_DEFAULT   0x0010
#define IACE_IGNORENOCONTEXT   0x0020

// dwFlags for ImmGetImeMenuItems
#define IGIMIF_RIGHTMENU   0x00000001

// dwType for ImmGetImeMenuItems
#define IGIMII_CMODE   0x00000001
#define IGIMII_SMODE   0x00000002
#define IGIMII_CONFIGURE   0x00000004
#define IGIMII_TOOLS   0x00000008
#define IGIMII_HELP   0x00000010
#define IGIMII_OTHER   0x00000020
#define IGIMII_INPUTTOOLS   0x00000040

// fType of IMEMENUITEMINFO structure
#define IMFT_RADIOCHECK 0x00001
#define IMFT_SEPARATOR  0x00002
#define IMFT_SUBMENU   0x00004

// fState of IMEMENUITEMINFO structure
#define IMFS_GRAYED   MFS_GRAYED
#define IMFS_DISABLED   MFS_DISABLED
#define IMFS_CHECKED   MFS_CHECKED
#define IMFS_HILITE   MFS_HILITE
#define IMFS_ENABLED   MFS_ENABLED
#define IMFS_UNCHECKED   MFS_UNCHECKED
#define IMFS_UNHILITE   MFS_UNHILITE
#define IMFS_DEFAULT   MFS_DEFAULT
#endif /* WINVER >= 0x040A */

// type of soft keyboard
// for Windows Tranditional Chinese Edition
#define SOFTKEYBOARD_TYPE_T1   0x0001
// for Windows Simplified Chinese Edition
#define SOFTKEYBOARD_TYPE_C1   0x0002

// protype of IME APIs 
//#define IME_API __declspec(dllexport) 
#define IME_API  
IME_API BOOL WINAPI ImeInquire(LPIMEINFO, LPTSTR lpszUIClass, LPCTSTR lpszOptions); 
IME_API BOOL WINAPI ImeConfigure(HKL, HWND, DWORD, LPVOID); 
IME_API DWORD WINAPI ImeConversionList(HIMC, LPCTSTR, LPCANDIDATELIST, DWORD dwBufLen, UINT uFlag); 
IME_API BOOL WINAPI ImeDestroy(UINT); 
IME_API LRESULT WINAPI ImeEscape(HIMC, UINT, LPVOID); 
IME_API BOOL WINAPI ImeProcessKey(HIMC, UINT, LPARAM, CONST LPBYTE); 
IME_API BOOL WINAPI ImeSelect(HIMC, BOOL); 
IME_API BOOL WINAPI ImeSetActiveContext(HIMC, BOOL); 
IME_API UINT WINAPI ImeToAsciiEx(UINT uVirtKey, UINT uScaCode, CONST LPBYTE lpbKeyState, LPDWORD lpdwTransBuf, UINT fuState, HIMC); 
IME_API BOOL WINAPI NotifyIME(HIMC, DWORD, DWORD, DWORD); 
IME_API BOOL WINAPI ImeRegisterWord(LPCTSTR, DWORD, LPCTSTR);
IME_API BOOL WINAPI ImeUnregisterWord(LPCTSTR, DWORD, LPCTSTR);
IME_API UINT WINAPI ImeGetRegisterWordStyle(UINT nItem, LPSTYLEBUF);
IME_API UINT WINAPI ImeEnumRegisterWord(REGISTERWORDENUMPROC, LPCTSTR, DWORD, LPCTSTR, LPVOID);
IME_API BOOL WINAPI ImeSetCompositionString(HIMC, DWORD dwIndex, LPCVOID lpComp, DWORD, LPCVOID lpRead, DWORD);
#if(WINVER >= 0x040A) 
IME_API DWORD   WINAPI ImeGetImeMenuItems(HIMC, DWORD, DWORD, LPIMEMENUITEMINFO, LPIMEMENUITEMINFO, DWORD); 
#endif  
 
 
#ifdef __cplusplus
}
#endif

#endif  // _IMM_H
